﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.DAO;
using HerGoS.Documentos.Entities;
using System.Data;
using HerGoS.Interfaces;
using HerGoS.Administration.Entities;
using HerGoS.Documentos.Exceptions;
using HerGoS.Administration.Engine;

namespace HerGoS.Documentos.Engine
{
   public class GestorTipoMovimiento
    {
       public static TipoMovimiento Obtener(int OID)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "TTIPOMOVIMIENTO_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", OID);
                DataTable  dt = repo.ExecuteDataTable();
                TipoMovimiento result = dt.ToGenericList<TipoMovimiento>(TipoMovimientoConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new TipoDocumentoGetException(ex);
            }
        }

        public static void Guardar(TipoMovimiento tipomovimiento)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryDocumentosName);
                repo.Nombre = "TTIPOMOVIMIENTO_PROC";
                repo.AddParameter("@ACCION ",tipomovimiento.Persistencia);
                repo.AddParameter("@ID", tipomovimiento.OID);
				repo.AddParameter("@CODIGO", tipomovimiento.Codigo);
		        repo.AddParameter("@DESCRIPCION", tipomovimiento.Descripcion);
		        repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                tipomovimiento.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                GestorBitacora.Guardar(tipomovimiento);
             
            }
            catch (Exception ex)
            {
                throw new TipoMovimientoSaveException(ex);
            }
        }

        public static void Eliminar(TipoMovimiento tipomovimiento)
        {
            tipomovimiento.Persistencia = EstadoPersistencia.DELETE;
            Guardar(tipomovimiento);
            tipomovimiento.Persistencia = EstadoPersistencia.UPDATE;
            tipomovimiento.Activo = false;
        }


        public static void ReActivar(TipoMovimiento tipomovimiento)
        {
            tipomovimiento.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(tipomovimiento);
            tipomovimiento.Persistencia = EstadoPersistencia.UPDATE;
            tipomovimiento.Activo = true;
        }

        public static List<TipoMovimiento> Consultar(string codigo, string descripcion, bool? activo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryDocumentosName);
                repo.Nombre = "TTIPOMOVIMIENTO_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@CODIGO", codigo);
                repo.AddParameter("@DESCRIPCION", descripcion);
                repo.AddParameter("@ACTIVO", activo);
                DataTable dt = repo.ExecuteDataTable();
                List<TipoMovimiento> result = dt.ToGenericList<TipoMovimiento>(TipoMovimientoConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new TipoDocumentoGetException(ex);
            }
        }

        public static List<TipoMovimiento> Consultar()
        {
            return Consultar(null, null, null);

        }




		#region Converter

        public static TipoMovimiento TipoMovimientoConverter(DataRow row)
        {
            TipoMovimiento tipomovimiento  =  new TipoMovimiento
            {
				OID = row["tmovID"].ToInteger(),
				Persistencia = EstadoPersistencia.UPDATE,
				Codigo = row["tmovCODIGO"].ToString(),
		        Descripcion = row["tmovDESCRIPCION"].ToString(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };

            return tipomovimiento;
        }
        #endregion
	}
        
}
